package com.qf.application.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qf.application.entity.Menu;
import com.qf.application.mapper.MenuMapper;
import com.qf.application.service.IMenuService;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {
    @Override
    public List<Map<String, Object>> treeDate(Integer root) {

        QueryWrapper wrapper = new QueryWrapper();
        wrapper.orderByAsc("pid");

        if (root == 0) { // 不显示一级菜单
            wrapper.ne("pid", -1);
        }

        // 1.查询所有的菜单数据
        List<Menu> menus = baseMapper.selectList(wrapper);

        // 2.简单的JSON转成标准的JOSN格式
        return listToJSON(menus);
    }

    @Override
    public Menu info(Integer id) {
        return baseMapper.info(id);
    }

    private List<Map<String, Object>> listToJSON(List<Menu> menus) {

        // 1.准备一个集合用来存放所有的封装好的数据
        List<Map<String, Object>> nodeList = new ArrayList<>();

        // 2.准备一个临时的Map用来区分父节点
        Map<String, Map<String, Object>> tMap = new HashMap<>();
        for (Menu menu : menus) {
            // 3、判断父节点是否存在
            if (tMap.containsKey(menu.getPid() + "")) {
                // 如果父节点存在，就把当前菜单放到对应的子节点下面
                Map<String, Object> pNode = tMap.get(menu.getPid() + "");
                addNode((List<Map<String, Object>>) pNode.get("children"), menu, tMap);
            } else {
                // 4、不存在就创建父节点
                addNode(nodeList, menu, tMap);
            }
        }
        return nodeList;
    }

    private void addNode(List<Map<String, Object>> listNode, Menu menu, Map<String, Map<String, Object>> tmap) {

        // 把菜单数据封装到Map中，因为前端只需要id，name，children字段
        Map<String, Object> node = new HashMap<>();
        node.put("id", menu.getId());
        node.put("name", menu.getUrlName());
        node.put("type", menu.getType());
        node.put("pid", menu.getPid());
        node.put("url", menu.getUrl());
        node.put("children", new ArrayList<Map<String, Object>>());

        // 把父节点记录到临时的Map中
        tmap.put(menu.getId() + "", node);

        // 添加到节点中
        listNode.add(node);
    }

}
